(function (){

    function init(){
             $.ajax({
            url:'/get_data',
            type:'GET',
            dataType:'JSON',
            success: function (arg) {
                init_globaldata(arg.global_dict);
                init_head(arg.table_config);
                init_body(arg.table_config,arg.data_list)
            }});
    }
    String.prototype.format=function(kwargs){
        var ret=this.replace(/\{(\w+)\}/g,function(km,m){
            return kwargs[m]
        });
        return ret;
    };

    function init_head(arg){
        var tr=document.createElement('tr');
        $.each(arg,function(k,v){
            if (v.display){
                var th=document.createElement('th');
                th.innerHTML= v.title;
                tr.append(th)
            }
            $('#t_body').append(tr)
        })
    }
    function init_body(table_config,data_list){
        $.each(data_list, function (k,row) {
            var tr=document.createElement('tr');
            $.each(table_config,function(i,config){
                if (config.display){
                    var td=document.createElement('td');
                    var kwargs={};
                    $.each(config.text.kwargs,function(k,v){
                        if(v.substring(0,2) == '@@'){
                            var global_name = v.substring(2, v.length);
                            var current_id=row[config.q];
                            var t=id_get_name(global_name,current_id);
                            kwargs[k]=t;
                        }
                        else if (v[0] == '@'){
                            kwargs[k] = row[v.substring(1,v.length)];
                        }else {
                            kwargs[k]=v;
                        }
                        var tmp=config.text.content.format(kwargs);
                        td.innerHTML=tmp;
                        $.each(config.attrs,function(kk,vv){
                            var VV= vv.substring(0,1);
                            if(VV == '@'){
                                td.setAttribute(kk,row[vv.substring(1,vv.length)])
                            }
                            else {
                                td.setAttribute(kk,vv)
                            }


                        })
                        $(tr).attr('row_id',row['id'])
                        $(tr).append(td);

                    })


                }
                $('#t_body').append(tr)
            })

        })
    }
    function init_globaldata(global_dict){
        $.each(global_dict,function(k,v){
            window[k]=v
        })
    }
    function id_get_name(globalname,current_id){
        var ret=null;
        $.each(window[globalname],function(k,m){
            if(m[0] == current_id){
                ret=m[1];
                return
            }
        })
        return ret;
    }
    function bind_editMode(){
        $('#editMode').click(function(){
            var ifinEditmode = $(this).hasClass('btn-warning');
            if (ifinEditmode){
                $(this).removeClass('btn-warning');
                $(this).val('进入编辑模式')
                var allbox = $('#t_body').find(':checkbox');
                $.each(allbox,function(){
                    if($(this).prop('checked')){
                        var cuTr = $(this).parent().parent();
                        exiteditmode(cuTr)
                    }
                })
            }else {
                $(this).addClass('btn-warning');
                $(this).val('退出编辑模式')
                var int = $('#t_body').find(':checked');
                $.each(int,function(k,v){
                    var cuTr = $(v).parent().parent();
                    intoeditmode(cuTr)

                })
            }

        })
    }
    function intoeditmode(curTr){
      curTr.addClass('success');
      curTr.children().each(function(){
          if($(this).attr('edit-enable') == 'true'){
              $(this).parent().attr('has_edit','true')
              var Val = $(this).text();
              var type = $(this).attr('edit-type');
              var gN=$(this).attr('global-name');
              var origin= $(this).attr('origin');
              if(type == 'select'){
                 var tag=document.createElement('select');
                  $.each(window[gN],function(k2,v2){
                      var op=document.createElement('option');
                      op.setAttribute('value',v2[0]);
                      op.innerHTML=v2[1];
                      tag.append(op)
                      tag.className='form-control'
                  });
                  tag.value=origin;
                  $(this).html(tag)
              }else if(type == 'input'){
                  var tag=document.createElement('input');
                  tag.value=Val;
                  tag.className='form-control'
                  $(this).html(tag)
              }
          }
      })

    }
    function exiteditmode(curTr){
      curTr.removeClass('success');
      curTr.children().each(function(){
          if($(this).attr('edit-enable') == 'true'){
              if($(this).attr('edit-type') == 'select'){
                  var cuse = $(this).children().first();
                  var Val = cuse.val();
                  var Text = cuse[0].selectedOptions[0].innerHTML;
                  $(this).html(Text)
                  $(this).attr('new_val',Val)
              }else  if($(this).attr('edit-type') == 'input'){
                  var Val = $(this).children().first().val();
                  $(this).html(Val)
                  $(this).attr('new_val',Val)
                            }
          }
      })
    }
    function  bind_checkbox(){
        $('#t_body').on('click',':checkbox',function(){
        if($('#editMode').hasClass('btn-warning')){
            var yn = $(this).prop('checked');
            var curTr = $(this).parent().parent();
            if(yn){
               intoeditmode(curTr)
            }else {
                exiteditmode(curTr)
            }
        }
    })}
    function quanxuan(){
       $('#xuanze_all').click(function(){
            var se=$('#t_body').find(':checkbox');
           $.each(se,function(){
               if($('#editMode').hasClass('btn-warning')){
                   if ($(this).prop('checked')){

                   }else {
                      $(this).prop('checked',true);
                  var Tr = $(this).parent().parent();
                   intoeditmode(Tr)
                   }



               }
               else {
                   var allcheckbox=$('#t_body').find(':checkbox');
                   $.each(allcheckbox,function(){
                       $(this).prop('checked',true)
                   })
               }

           })
       })

    }
    function fanxuan(){
        $('#fanxuan').click(function(){
            var allcheck=$('#t_body').find(':checkbox');
            $.each(allcheck,function(){
                if($(this).prop('checked')){
                    $(this).prop('checked',false)
                }else {
                    $(this).prop('checked',true)
                }
            })
        })
    }
    function quxiaoall(){
        $('#quxiaoall').click(function(){
            if($('#editMode').hasClass('btn-warning')){
                var allcheck=$('#t_body').find(':checkbox');
                $.each(allcheck,function(){
                    if($(this).prop('checked')){
                       var cutr= $(this).parent().parent();
                        $(this).prop('checked',false)
                        exiteditmode(cutr)
                    }
                })
            }
        })
    }
    function save(){
        uri='';
        $('#save').click(function () {
            var allTr = $('#t_body').find('tr');
            data=[];
            $.each(allTr,function(){
           //循环每个tr
                if($(this).attr('has_edit') == 'true'){
                 var tmp={};
                    var tD = $(this).children();
                    var row_id=$(this).attr('row_id');
                    $.each(tD,function(){
                        //循环每个td
                        var oldVal = $(this).attr('origin');
                        var newVal= $(this).attr('new_val');
                          if(oldVal != newVal){
                            tmp['id']=row_id;
                            tmp[$(this).attr('global-name')]=newVal;
                        }

                    })
                    data.push(tmp)
                }
            })
            $.ajax({
                url:uri,
                type:'POST',
                data:{'data':JSON.stringify(data)},
                dataType:'JSON',
                success:function(arg){
                    $('#msg').html(arg['status'])
                    function hidemsg(){
                        $('#msg').html(' ')
                    }
                    setTimeout(hidemsg,2000)
                }
            })
        })

    }
    jQuery.extend({
        'NB':function(url){
            init();
        bind_editMode();
        bind_checkbox();
        quanxuan();
        fanxuan();
        quxiaoall();
        save(url)

        }
    })
})()